/* ==================================================================   
 * Created [2009-4-27 下午11:32:55] by Jon.King 
 * ==================================================================  
 * TSS 
 * ================================================================== 
 * mailTo:jinpujun@hotmail.com
 * Copyright (c) Jon.King, 2009-2012 
 * ================================================================== 
*/

package com.jinhe.tss.core;

import java.io.IOException;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import com.jinhe.tss.core.util.XMLDocUtil;
 
public class HttpClientDemo {
    // 构造HttpClient的实例
    HttpClient httpClient = new HttpClient();

    public String fetchWebPageByGet(String url) throws HttpException, IOException {
        // 创建GET方法的实例
        GetMethod getMethod = new GetMethod(url);
        // 设置成了默认的恢复策略，在发生异常时候将自动重试3次，在这里你也可以设置成自定义的恢复策略
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
        getMethod.setRequestHeader("_key", "150644D54411599E315D1876DF8DCA0F");
        try {
            // 执行getMethod
            int statusCode = httpClient.executeMethod(getMethod);
            if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: " + getMethod.getStatusLine());
            }
            // 读取内容
            byte[] responseBody = getMethod.getResponseBody();
            // 处理内容
            return new String(responseBody);
        } catch (HttpException e) {
            // 发生致命的异常，可能是协议不对或者返回的内容有问题
            System.out.println("Please check your provided http address!");
            e.printStackTrace();
        } catch (IOException e) {
            // 发生网络异常
            e.printStackTrace();
        } finally {
            // 释放连接
            getMethod.releaseConnection();
        }
        return null;
    }
    
    public void loginBBSByPost(String url) throws HttpException, IOException {
        PostMethod postMethod = new PostMethod(url);
        // 填入各个表单域的值
        NameValuePair[] params = { new NameValuePair("operatorCode", "admin"), new NameValuePair("password", "123456") };
        // 将表单的值放入postMethod中
        postMethod.setRequestBody(params);
        
        // 执行postMethod
        int statusCode = httpClient.executeMethod(postMethod);
        // HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发
        // 301或者302
        if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
                || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
            // 从头中取出转向的地址
            Header locationHeader = postMethod.getResponseHeader("location");
            String location = null;
            if (locationHeader != null) {
                location = locationHeader.getValue();
                System.out.println("The page was redirected to:" + location);
            } else {
                System.err.println("Location field value is null.");
            }
        }
        
        // 读取内容
        byte[] responseBody = postMethod.getResponseBody();
        // 处理内容
        System.out.println(XMLDocUtil.dataXml2Doc(new String(responseBody)).selectSingleNode("//key").getText());
        
        Cookie[] cookies = httpClient.getState().getCookies();
        for (int i = 0; i < cookies.length; i++) {
            System.out.println("Cookie(" + cookies[i].getName() + ", " + cookies[i].getValue() + ")");
        }
        postMethod.releaseConnection();
        
        //如果每次访问要共享同一个session，则需要每次设置
        httpClient.getState().addCookies(cookies);
        //其中cookis为上次或者上次以前在同意session期中返回得cookie,即Cookie[] cookies = httpClient.getState().getCookies();
    }
    
    public void testLoginJCZL() throws HttpException, IOException{
        HttpClient httpClient1 = new HttpClient();
        PostMethod postMethod = new PostMethod("http://localhost:8088/jczl/login.in");
        // 填入各个表单域的值
        NameValuePair[] params = { new NameValuePair("operatorCode", "admin"), new NameValuePair("password", "123456") };
        // 将表单的值放入postMethod中
        postMethod.setRequestBody(params);
        
        // 执行postMethod
        int statusCode = httpClient1.executeMethod(postMethod);
        String key = null;
        if(statusCode == HttpStatus.SC_OK){
            // 读取内容
            byte[] responseBody = postMethod.getResponseBody();
            key = XMLDocUtil.dataXml2Doc(new String(responseBody)).selectSingleNode("//key").getText();
            
            Cookie[] cookies = httpClient1.getState().getCookies();
            for (int i = 0; i < cookies.length; i++) {
                System.out.println("Cookie(" + cookies[i].getName() + ", " + cookies[i].getValue() + ")");
            }
        }
        postMethod.releaseConnection();
        
        //------------------------------------------------------------------------------------------------------------
        
        HttpClient httpClient2 = new HttpClient();
        // 创建GET方法的实例
        GetMethod getMethod = new GetMethod("http://localhost:8088/jczl/framework.do");
        getMethod.setRequestHeader("_key", key);
        try {
            // 执行getMethod
            statusCode = httpClient2.executeMethod(getMethod);
            if (statusCode == HttpStatus.SC_OK)
                System.out.println(new String(getMethod.getResponseBody()));
        } catch (HttpException e) {
            e.printStackTrace(); // 发生致命的异常，可能是协议不对或者返回的内容有问题
        } catch (IOException e) {
            e.printStackTrace();  // 发生网络异常
        } finally {
            getMethod.releaseConnection(); // 释放连接
        }
    }

    public static void main(String[] args) throws HttpException, IOException {
        HttpClientDemo test = new HttpClientDemo();
        System.out.println(test.fetchWebPageByGet("http://www.google.com"));
//        test.loginBBSByPost("http://localhost:8088/jczl/login.in");
//        System.out.println(test.fetchWebPageByGet("http://localhost:8088/jczl/framework.do"));
        test.testLoginJCZL();
    }
}
